package Test.stream流测试;

import Test.Test02.Student;

import java.util.*;
import java.util.function.IntFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author kirito
 * @Date 2023/12/13 19:01
 * @PackageName:Test.stream流测试
 * @ClassName: a
 * @Description:
 * @Version 1.0
 */
public class StreamDemo5 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张三丰");

        Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
        List<String> zhangList = s1.collect(Collectors.toList());
        //List<String> zhangList = s1.toList(); // jdk16新添加方法 这种写法，返回不可变集合
        zhangList.add("新添加的元素"); //  如果添加元素 s1.toList()，方法会报错
        System.out.println(zhangList); // [张无忌, 张强, 张三丰, 张三丰, 新添加的元素]

        // 注意：流只能使用一次，若要重新使用流，需要重新定义
        Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));
        Set<String> zhangSet = s2.collect(Collectors.toSet()); // 收集成Set
        System.out.println(zhangSet); // [张强, 张三丰, 张无忌]

        Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
        Object[] arrs = s3.toArray();// 收集成数组
        System.out.println(Arrays.toString(arrs)); // [张无忌, 张强, 张三丰, 张三丰]

        // 拓展：收集成指定流，如 String 流
        Stream<String> s4 = list.stream().filter(s -> s.startsWith("张"));
        String[] array = s4.toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });// 收集成数组

        // String[] array = s4.toArray( value -> new String[value] );
        // String[] array = s4.toArray(String[]::new);
        System.out.println(Arrays.toString(array)); // [张无忌, 张强, 张三丰, 张三丰]
    }
}


